function [msg_cycle_finished, alg_finished] = mobile_msg_cycle_step( alg_param )
    
    global nodes_count;
    global N_Map;
    global emit_energy;
    global S_Map;
    global f1;
    global radio_range;         % radio range
    global BS_x;                % Base Station X position
    global BS_y;                % Base Station Y position
    global mobile_cur_node;     % sensor, który próbuje nadać wiadomość
    global mobile_m;            % stopień krzywej Hilberta
    global mobile_scale;        % skala = scene_size/mobile_size 
    global mobile_bsdata;       % specyficzne dane stacji bazowej
    global mobile_speed;        % prędkość stacji bazowej w jednostkach/hop
    global mobile_Hilbert_s;    % stan początkowy krzywej Hilberta
    
    % najpierw ruch stacji bazowej
    mobile_bsdata(3) = mobile_bsdata(3) + mobile_speed;
    
    if (pow2(2*mobile_m)-1<mobile_bsdata(3)) % stacja dotarła do końca krzywej
        mobile_bsdata(3) = 0;
        
        fig1_clear();
        
        % nowy kierunek na krzywej
        if (mobile_Hilbert_s == 0)
            mobile_Hilbert_s = 5;
        elseif (mobile_Hilbert_s == 5)
            mobile_Hilbert_s = 6;
        elseif (mobile_Hilbert_s == 6)
            mobile_Hilbert_s = 3;
        elseif (mobile_Hilbert_s == 3)
            mobile_Hilbert_s = 0;
        end
    end
    
    % nowa pozycja stacji bazowej na kratownicy
    [Av(1),Av(2)] = mobile_hilbert2euklides(floor(mobile_bsdata(3)),mobile_m,mobile_Hilbert_s);
    [Nv(1),Nv(2)] = mobile_hilbert2euklides(floor(mobile_bsdata(3))+1,mobile_m,mobile_Hilbert_s);
    mobile_bsdata(1:2) = Av+(mobile_bsdata(3)-floor(mobile_bsdata(3)))*(Nv-Av);
    
    % nowa pozycja stacji bazowej w terenie
    BS_x = (mobile_bsdata(1)+0.5) * mobile_scale;
    BS_y = (mobile_bsdata(2)+0.5) * mobile_scale;
    
    % zaznaczenie ruchu stacji bazowej
    figure(f1);
    X1=[S_Map(nodes_count+1,1),BS_x];
    Y1=[S_Map(nodes_count+1,2),BS_y];
    Z1=[S_Map(nodes_count+1,3),S_Map(nodes_count+1,3)];
    line(X1,Y1,Z1,'Color',[ 0 0.3 0.5]);
    %plot3(X1,Y1,Z1,'black.');
    
    % uaktualnienie pozycji stacji bazowej w S_Map
    S_Map(nodes_count+1,1)=BS_x;
    S_Map(nodes_count+1,2)=BS_y;
    
    dif(1:2) = S_Map(nodes_count+1,1:2) - S_Map(mobile_cur_node,1:2);
    alg_finished = false;
    msg_cycle_finished = false;
    
    if ( dif(1)^2+dif(2)^2 <= radio_range^2)   
        % wiadomość dociera do stacji bazowej
        msg_cycle_finished = true;
        emit_data(mobile_cur_node,false);
        % mobile_check_field(mobile_sdata(mobile_cur_node,1:2));
        draw_line_f1(mobile_cur_node, nodes_count+1, [ 1.0 0 0] );
        
    else
        
        % podajemy dalej
        next_node = mobile_cur_node;
        while ( next_node == mobile_cur_node)
            best_node = 0;
            best_n_pos = 0;
            best_dist = 2*100*100;
            
            % znajdujemy sasiada najblizej stacji bazowej
            for j=1:N_Map(mobile_cur_node,1,1)
                if N_Map(mobile_cur_node,j+1,1)>0
                    pos = S_Map(N_Map(mobile_cur_node,j+1,1),1:2);
                    dist = (BS_x-pos(1))^2 + (BS_y-pos(2))^2;
                    if (dist<best_dist)
                        best_n_pos = j;
                        best_dist = dist;
                        best_node = N_Map(mobile_cur_node,j+1,1);
                    end
                end
            end
            
            if (best_node == 0)
                % nie mamy do kogo wyslac - koniec algorytmu
                alg_finished = true;
                msg_cycle_finished = true;
                break;
            end
                
            % wysylamy dane do najlepszego wezla
            emit_data(mobile_cur_node,false);
            
            if (S_Map(best_node,3)<emit_energy)
                % wezel nie ma energii
                % usuwamy wezel z listy
                N_Map(mobile_cur_node,best_n_pos,1) = -1; %#ok<AGROW>
            else
                % odbieramy potwierdzenie = przeslanie wiadomosci dalej
                recv_data(mobile_cur_node);
                next_node = best_node;
            end
            
        end
        
        % rysujemy linię transmisji
        draw_line_f1(mobile_cur_node, next_node, [ 0.9 0.9 0.5] );

        % przechodzimy do następnego węzła
        mobile_cur_node = next_node;
    end
      
end

